home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / pcl / src-16f.lha / compiler / sparc / memory.lisp < prev    next >
Encoding:
Text File  |  1991-11-06  |  5.1 KB  |  161 lines

  1. ;;; -*- Package: SPARC -*-
  2. ;;;
  3. ;;; **********************************************************************
  4. ;;; This code was written as part of the Spice Lisp project at
  5. ;;; Carnegie-Mellon University, and has been placed in the public domain.
  6. ;;; If you want to use this code or any part of Spice Lisp, please contact
  7. ;;; Scott Fahlman (FAHLMAN@CMUC). 
  8. ;;; **********************************************************************
  9. ;;;
  10. ;;; $Header: memory.lisp,v 1.1 90/11/30 17:04:52 wlott Exp $
  11. ;;;
  12. ;;;    This file contains the SPARC definitions of some general purpose memory
  13. ;;; reference VOPs inherited by basic memory reference operations.
  14. ;;;
  15. ;;; Written by Rob MacLachlan
  16. ;;;
  17. ;;; Converted by William Lott.
  18. ;;; 
  19.  
  20. (in-package "SPARC")
  21.  
  22. ;;; Cell-Ref and Cell-Set are used to define VOPs like CAR, where the offset to
  23. ;;; be read or written is a property of the VOP used.  Cell-Setf is similar to
  24. ;;; Cell-Set, but delivers the new value as the result.  Cell-Setf-Function
  25. ;;; takes its arguments as if it were a setf function (new value first, as
  26. ;;; apposed to a setf macro, which takes the new value last).
  27. ;;;
  28. (define-vop (cell-ref)
  29.   (:args (object :scs (descriptor-reg)))
  30.   (:results (value :scs (descriptor-reg any-reg)))
  31.   (:variant-vars offset lowtag)
  32.   (:policy :fast-safe)
  33.   (:generator 4
  34.     (loadw value object offset lowtag)))
  35. ;;;
  36. (define-vop (cell-set)
  37.   (:args (object :scs (descriptor-reg))
  38.          (value :scs (descriptor-reg any-reg)))
  39.   (:variant-vars offset lowtag)
  40.   (:policy :fast-safe)
  41.   (:generator 4
  42.     (storew value object offset lowtag)))
  43. ;;;
  44. (define-vop (cell-setf)
  45.   (:args (object :scs (descriptor-reg))
  46.      (value :scs (descriptor-reg any-reg)
  47.         :target result))
  48.   (:results (result :scs (descriptor-reg any-reg)))
  49.   (:variant-vars offset lowtag)
  50.   (:policy :fast-safe)
  51.   (:generator 4
  52.     (storew value object offset lowtag)
  53.     (move result value)))
  54. ;;;
  55. (define-vop (cell-setf-function)
  56.   (:args (value :scs (descriptor-reg any-reg)
  57.         :target result)
  58.      (object :scs (descriptor-reg)))
  59.   (:results (result :scs (descriptor-reg any-reg)))
  60.   (:variant-vars offset lowtag)
  61.   (:policy :fast-safe)
  62.   (:generator 4
  63.     (storew value object offset lowtag)
  64.     (move result value)))
  65.  
  66. ;;; Define-Cell-Accessors  --  Interface
  67. ;;;
  68. ;;;    Define accessor VOPs for some cells in an object.  If the operation name
  69. ;;; is NIL, then that operation isn't defined.  If the translate function is
  70. ;;; null, then we don't define a translation.
  71. ;;;
  72. (defmacro define-cell-accessors (offset lowtag
  73.                     ref-op ref-trans set-op set-trans)
  74.   `(progn
  75.      ,@(when ref-op
  76.      `((define-vop (,ref-op cell-ref)
  77.          (:variant ,offset ,lowtag)
  78.          ,@(when ref-trans
  79.          `((:translate ,ref-trans))))))
  80.      ,@(when set-op
  81.      `((define-vop (,set-op cell-setf)
  82.          (:variant ,offset ,lowtag)
  83.          ,@(when set-trans
  84.          `((:translate ,set-trans))))))))
  85.  
  86.  
  87. ;;; Slot-Ref and Slot-Set are used to define VOPs like Closure-Ref, where the
  88. ;;; offset is constant at compile time, but varies for different uses.  We add
  89. ;;; in the stardard g-vector overhead.
  90. ;;;
  91. (define-vop (slot-ref)
  92.   (:args (object :scs (descriptor-reg)))
  93.   (:results (value :scs (descriptor-reg any-reg)))
  94.   (:variant-vars base lowtag)
  95.   (:info offset)
  96.   (:generator 4
  97.     (loadw value object (+ base offset) lowtag)))
  98. ;;;
  99. (define-vop (slot-set)
  100.   (:args (object :scs (descriptor-reg))
  101.      (value :scs (descriptor-reg any-reg)))
  102.   (:variant-vars base lowtag)
  103.   (:info offset)
  104.   (:generator 4
  105.     (storew value object (+ base offset) lowtag)))
  106.  
  107.  
  108.  
  109. ;;;; Indexed references:
  110.  
  111. ;;; Define-Indexer  --  Internal
  112. ;;;
  113. ;;;    Define some VOPs for indexed memory reference.
  114. ;;;
  115. (defmacro define-indexer (name write-p op shift)
  116.   `(define-vop (,name)
  117.      (:args (object :scs (descriptor-reg))
  118.         (index :scs (any-reg zero immediate))
  119.         ,@(when write-p
  120.         '((value :scs (any-reg descriptor-reg) :target result))))
  121.      (:arg-types * tagged-num ,@(when write-p '(*)))
  122.      (:temporary (:scs (non-descriptor-reg)) temp)
  123.      (:results (,(if write-p 'result 'value)
  124.         :scs (any-reg descriptor-reg)))
  125.      (:result-types *)
  126.      (:variant-vars offset lowtag)
  127.      (:policy :fast-safe)
  128.      (:generator 5
  129.        (sc-case index
  130.      ((immediate zero)
  131.       (let ((offset (- (+ (if (sc-is index zero)
  132.                   0
  133.                   (ash (tn-value index)
  134.                        (- vm:word-shift ,shift)))
  135.                   (ash offset vm:word-shift))
  136.                lowtag)))
  137.         (etypecase offset
  138.           ((signed-byte 13)
  139.            (inst ,op value object offset))
  140.           ((or (unsigned-byte 32) (signed-byte 32))
  141.            (inst li temp offset)
  142.            (inst ,op value object temp)))))
  143.      (t
  144.       ,@(unless (zerop shift)
  145.           `((inst srl temp index ,shift)))
  146.       (inst add temp ,(if (zerop shift) 'index 'temp)
  147.         (- (ash offset vm:word-shift) lowtag))
  148.       (inst ,op value object temp)))
  149.        ,@(when write-p
  150.        '((move result value))))))
  151.  
  152. (define-indexer word-index-ref nil ld 0)
  153. (define-indexer word-index-set t st 0)
  154. (define-indexer halfword-index-ref nil lduh 1)
  155. (define-indexer signed-halfword-index-ref nil ldsh 1)
  156. (define-indexer halfword-index-set t sth 1)
  157. (define-indexer byte-index-ref nil ldub 2)
  158. (define-indexer signed-byte-index-ref nil ldsb 2)
  159. (define-indexer byte-index-set t stb 2)
  160.  
  161.